深入解析「假充值(Fake Deposit)」

深入解析「假充值(Fake Deposit)」漏洞:原理、类型与防御策略

在去中心化交易所(DEX)和中心化交易所(CEX)的安全领域中,**假充值(Fake Deposit)**是一种极具破坏性的攻击手段。它不同于简单的“凭空造币”,而是通过利用系统逻辑漏洞,使系统误认为资产已经到账,而实际上链上并未发生真实的资产转移。本文将深入探讨假充值的定义、成因、类型及其防御策略,为开发者提供全面的安全指南。

一、假充值的基本概念

假充值本质上是一类状态认知错误(State Mismatch)漏洞,其核心在于系统对资产状态的错误判断。常见成因包括:

假充值的后果通常十分严重,攻击者可以获得虚假余额,随后提取真实资产(如ETH或稳定币),而协议或交易所则需承担全部损失。

二、合约层面的假充值类型(DEX核心风险)

1. 转账“假成功”:未检查返回值(经典漏洞)

背景

早期ERC20标准未强制要求失败时revert,允许返回false。典型代表如早期USDT代币。

漏洞代码示例

function deposit(uint256 amount) external {
    // ❌ transferFrom失败但不revert
    token.transferFrom(msg.sender, address(this), amount);
    
    // ❌ 合约错误地认为充值成功
    balanceOf[msg.sender] += amount;
}

攻击效果

⚠️ 这是历史上出现频率最高、审计必查的漏洞之一。

2. 「余额差额不校验」导致的逻辑假充值

背景

并非严格意义的“假转账”,但后果等价。以下代币类型都可能导致amount ≠ 实际到账

错误假设

balance += amount; // ❌ 假设amount == 实际到账

正确模型:只信状态变化

uint256 before = token.balanceOf(address(this));
token.safeTransferFrom(msg.sender, address(this), amount);
uint256 afterBal = token.balanceOf(address(this));
uint256 actual = afterBal - before;
require(actual > 0, "Fake deposit");

✅ 这是DEX/Vault/Bridge中的最佳实践。

3. 假代币攻击(Fake Token / Evil Token)

攻击原理

攻击者部署恶意ERC20代币,其特点包括:

然后,攻击者创建FakeToken/ETH池,向池子“充值”巨额FakeToken,并利用真实资产(ETH/稳定币)进行套利。

⚠️ 关键认知纠正

SafeERC20无法防御恶意代币本身,因为:

防御策略

4. 重入导致的“逻辑双重充值”(非纯假充值)场景

错误模式

function deposit(uint amount) {
    token.transferFrom(...); // 外部调用
    balance += amount;       // 状态更新在后
}

攻击效果

防御策略

这是充值路径+外部调用的必查点。

三、链下监听假充值(CEX/钱包/Bridge常见)

5. Approve被误判为充值(真实世界高危案例)

攻击行为

approve(exchange, 1_000_000);

后端错误逻辑

真实链上含义

正确防御

方法 selector
transfer 0xa9059cbb
approve 0x095ea7b3

6. 只看交易成功,不校验事件

错误做法

正确做法

四、进阶:为什么“只看Event也不够”?

⚠️ 恶意代币可以:

终极防御(交易所级别)

五、系统级防御原则(可直接放审计报告)

核心安全哲学

Never trust input, return value, or event.
Only trust verified state transitions.

不信任输入、返回值或事件,只信任经过验证的状态转换。

六、总结Checklist(审计/设计必查)

风险点 防御方式 优先级
返回值错误 SafeERC20 ⭐⭐⭐
实际到账 balance delta ⭐⭐⭐
恶意代币 白名单 ⭐⭐⭐
approve误判 解析input ⭐⭐⭐
事件伪造 storage/trace ⭐⭐
重入 CEI/Guard ⭐⭐⭐

通过深入理解假充值的原理、类型和防御策略,开发者可以更加有效地保护其智能合约和系统免受此类攻击。在设计和审计过程中,务必遵循上述Checklist,确保系统的安全性和稳定性。